package 双指针.二分查找;

/*
解题思路：
    这里主要要抓住如何用二分法缩小区间。
    一个升序数组，如果没有乱序。则nums[mid]<=nums[right]；这就证明右边是有序的，相当于[mid,right]这个区间都是递增的或者证明数组只有一个元素，
    所以呢，去左边区间查找。直到left=mid=right时候，就找到了目标值。
 */
public class 寻找旋转排序数组中的最小值_153 {

    public static void main(String[] args) {

        int[] nums = new int[]{3, 1, 2};
        System.out.println(new 寻找旋转排序数组中的最小值_153().findMin(nums));
    }

    public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;

        while (left < right) {//这里不可以用=。会产生死循环，自己带入一个例子试一试，比如[3, 1, 2]
            int mid = left + (right - left) / 2;
            if (nums[mid] <= nums[right]) {//右边是递增的所以在左边找。之所以有等号，那是因为考虑到只有一个元素的情况，mid==right
                right = mid;//注意 right 更新时会被设为 mid 而不是 mid-1，因为 mid 无法被排除，比如[3,1,2]。
            } else {//如果nums[mid]>nums[right]那么证明右边产生了乱序，则在右边查找
                left = mid + 1;//因为nums[mid]>nums[right]所以可以保证mid不是最小值，故而left=mid+1;
            }
        }
        return nums[left];//即当left=mid=right时候就是目标值,但是一般都返回left
    }


}
